// 封装一个请求工具
// 1 创建一个新的axios实例
// 2 请求的拦截器 如果有token进行头部拦截
// 3 响应拦截器 (1)剥离无效数据，获取有效数据 (2)处理token过期失效的情况
// 4  导出一个函数，调用当前axios实例请求，返回值promise 

import store from '@/store';
import axios from 'axios'
import router from '@/router'

// 1 创建一个新的axios实例
export const baseURL = 'http://pcapi-xiaotuxian-front-devtest.itheima.net/'
const instance = axios.create({
    // 设计基准路径
    baseURL: baseURL,
    // 过期时间
    timeout: 5000

})

// 2 请求的拦截器 如果有token进行头部拦截
instance.interceptors.request.use(config => {
    // 响应正确
    // 拦截业务逻辑
    // 如果本地有token 就在请求头中携带token
    // 1 获取用户信息对象
    const { profile } = store.state.user;

    // 2 判断token是否存在
    if (profile.token) {
        config.headers.Authorization = `Bearer ${profile.token}`
    }
    return config
}), err => {
    // 响应错误
    return Promise.reject(err);
}

// 3.响应拦截器 (1) 剥离无效数据，读取有效数据  (2) 处理token失效
instance.interceptors.response.use(res => res, err => {
    if (err.response && err.response.status === 401) {
        // 1 清除无效用户信息
        store.commit('user/setUser', {})
            // 2 跳转到登录页
        router.push('/login')
            // 3 跳转页面需要传递参数(当前的路由地址)给登录页
            // 当前路由地址
            // 组件里面  '/user?a=10' $touer.path
        const fullpath = encodeURIComponent(router.currentRoute.value.fullpath)
        router.push('/login?redirectUrl' + fullpath)
    }
    return Promise.reject(err)
})

// 4  导出一个函数，调用当前axios实例请求，返回值promise 
// 请求工具函数
export default (url, method, submitData) => {
    // 负责发请求，请求地址，请求方式，提交数据

    return instance({
        url,
        method,
        // 1 如果是get请求 需要使用params来传递
        // 2 如果不是get请求，需要使用data来传递
        // []设置一个动态key，写js表达式，js表达式的执行结果当作key

        [method.toLowerCase() === 'get' ? 'params' : 'data']: submitData
    })
}